function trim(str){ // 删除左右两端的空格
　　	 return str.replace(/(^\s*)|(\s*$)/g, "");
}
function input(str){// 只能输入汉字 字母 数字 下划线
	return str.match(/^[\u4E00-\u9FA5a-zA-Z0-9_-]{0,100}$/);
}
function inputNum(num){// 只能输入数字
	return num.match(/^[0-9]*$/);
}
function inputPercent(str){// 只能输入百分比
	var result = null;
	var index=str.indexOf("%");
	if(index!=-1 && index==str.length-1){
		return inputDouble(str.substring(0,index));
	}
	return result;
}
function inputInt(num)
{
	if(num==""){
		return 0;
	}else{
		if(!(/^-?[0-9]\d*$/.test(num))){
			return null;
		}else{
			if(num>9999999)return null
			else return 0;
		}
	}
}  
function inputDouble(num)
{
	if(num==""){
		return 0;
	}else{
		if(!(/^-?\d+\.\d+$/.test(num)) && !(/^\d+$/.test(num))){
			return null;
		}else{
			if(num>9999999)return null
			else return 0;
		}
	}
}  

/*
 * 方法:判断表单中所有的 text,password,textarea控件输入内容是否合法(非法字符跳出提示并锁定该控件) 参数:form控件 返回值:
 * true:验证成功,false:验证失败
 */
function checkForm(objForm) {
	$("input",$(objForm)).each(function (j) {
		$(this).val($.trim($(this).val()));	
	});
	var failed = false;
	$("input[isNull],select[isNull]",$(objForm)).each(function (j) {
		if($(this).val()==null || $(this).val()==""){
			failed=true;
			if(typeof($(this).attr("onfocus"))=="undefined")
				addError($(this),$(this).attr("isNull")+"不能为空.");
			else
				addError($(this),$(this).attr("isNull")+"不能为空.",1);
			return false;
		}
	});
	if(failed)
		return false;
	$("input[isNum]",$(objForm)).each(function (j) {
		var num = $(this).attr("isNum");
		var type = typeof($(this).attr("numType")) == "undefined" ? "1" : $(this).attr("numType");
		var value = $(this).val();
		if(value==""){
		}else if(type=="1"){
			if(inputDouble(value)==null || parseFloat(value)<=0){
				failed=true;
				addError($(this),num+"只允许输入大于0且小于9999999的数字.");
				return false;
			}
		}else{
			if(type=="0"){
				if(inputDouble(value)==null || parseFloat(value)<0){
					failed=true;
					addError($(this),num+"只允许输入大于等于0且小于9999999的数字.");
					return false;
				}
			}else if(type=="-1"){
				if(inputDouble(value)==null){
					failed=true;
					addError($(this),num+"只允许输入小于9999999数字.");
					return false;
				}
			}
		}
	});
	if(failed)
		return false;
	if(failed)
		return false;
	$("input[isInt]",$(objForm)).each(function (j) {
		var num = $(this).attr("isInt");
		var type = typeof($(this).attr("numType")) == "undefined" ? "1" : $(this).attr("numType");
		var value = $(this).val();
		if(value==""){
		}else if(type=="1"){
			if(inputInt(value)==null || parseFloat(value)<=0){
				failed=true;
				addError($(this),num+"只允许输入大于0且小于9999999的整数.");
				return false;
			}
		}else{
			if(type=="0"){
				if(inputInt(value)==null || parseFloat(value)<0){
					failed=true;
					addError($(this),num+"只允许输入大于等于0且小于9999999的整数.");
					return false;
				}
			}else if(type=="-1"){
				if(inputInt(value)==null){
					failed=true;
					addError($(this),num+"只允许输入小于9999999的整数.");
					return false;
				}
			}
		}
	});
	if(failed)
		return false;
	var length=objForm.elements.length;
	// 循环验证所有输入标签
	for ( var i = 0; i < length; i++) {
		var objItem = objForm.elements[i];
		if(!checkText(objItem)){
			$(objItem).val("");
			return false;
		}
	}
	$("input[isNum],input[isInt]",$(objForm)).each(function (j) {
		if($(this).val()=="" && typeof($(this).attr("notFill"))=="undefined")
			$(this).val("0");
	});
	return true;
}

function showError(id,msg) {
	if(!id || id==null || id=="")
		j_tip(msg, 'error');
	else
		addError(id,msg);
}
/*
 * 方法:判断text,password,textarea控件输入内容是否合法(非法字符跳出提示并锁定该控件)
 * 参数:text,password,textarea控件 返回值: true:验证成功,false:验证失败
 */
function checkText(objText) {
	// 判断控件类型
	if (objText.type == "hidden" || objText.type == "text" || objText.type == "password") {
		if (objText.value.indexOf("'") != -1 && objText.type != "textarea") {// 校验‘
			showError(objText.id,"提交的内容中含有非法字符『 ' 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf("'") != -1) {// 校验‘
			showError(objText.id,"提交的内容中含有非法字符『 ' 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf("select ") != -1) {// 校验 select
			showError(objText.id,"提交的内容中含有非法字符『 select 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf("insert ") != -1) {// 校验 insert
			showError(objText.id,"提交的内容中含有非法字符『 insert 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf(" or ") != -1) {// 校验 select
			showError(objText.id,"提交的内容中含有非法字符『 or 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf(" and ") != -1) {// 校验 insert
			showError(objText.id,"提交的内容中含有非法字符『 and 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf("update ") != -1) {// 校验 update
			showError(objText.id,"提交的内容中含有非法字符『 update 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf("delete ") != -1) {// 校验 delete
			showError(objText.id,"提交的内容中含有非法字符『 delete 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf("truncate ") != -1) {// 校验 truncate
			showError(objText.id,"提交的内容中含有非法字符『 truncate 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf("exec ") != -1) {// 校验 exec
			showError(objText.id,"提交的内容中含有非法字符『 exec 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf("&") != -1) {// 校验 &
			showError(objText.id,"提交的内容中含有非法字符『 & 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf("<") != -1) {// 校验 <
			showError(objText.id,"提交的内容中含有非法字符『 < 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf(">") != -1) {// 校验 >
			showError(objText.id,"提交的内容中含有非法字符『 > 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf("#") != -1) {// 校验 #
			showError(objText.id,"提交的内容中含有非法字符『 # 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf("alter ") != -1) {// 校验 alter
			showError(objText.id,"提交的内容中含有非法字符『 alter 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf("chr") != -1) {// 校验 chr
			showError(objText.id,"提交的内容中含有非法字符『 chr 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		if (objText.value.indexOf("mid") != -1) {// 校验 mid
			showError(objText.id,"提交的内容中含有非法字符『 mid 』，请重新填写！");
			objText.focus();
			objText.select();
			return false;
		}
		// textarea将半角'转换成全角＇
		if(objText.type == "textarea"){
			var temp = objText.value;
			var intquotation = 0;
			while (true) {
				intquotation = temp.indexOf("'");
				if (intquotation == -1) {
					break;
				}
				temp = temp.substring(0, intquotation) + "＇"
						+ temp.substring(intquotation + 1);
			}
			objText.value = temp;
		}
	}
	return true;
}

/**
 * 身份证15位编码规则：dddddd yymmdd xx p dddddd：地区码 yymmdd: 出生年月日 xx: 顺序类编码，无法确定 p:
 * 性别，奇数为男，偶数为女
 * <p />
 * 身份证18位编码规则：dddddd yyyymmdd xxx y dddddd：地区码 yyyymmdd: 出生年月日
 * xxx:顺序类编码，无法确定，奇数为男，偶数为女 y: 校验码，该位数值可通过前17位计算获得
 * <p />
 * 18位号码加权因子为(从右到左) Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2,1 ]
 * 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ] 校验位计算公式：Y_P = mod( ∑(Ai×Wi),11 )
 * i为身份证号码从右往左数的 2...18 位; Y_P为脚丫校验码所在校验码数组位置
 * 
 */  
  
var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ];// 加权因子
var ValideCode = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ];// 身份证验证位值.10代表X
function IdCardValidate(idCard) {  
    idCard = trim(idCard.replace(/ /g, ""));   
    if (idCard.length == 15) {   
        return isValidityBrithBy15IdCard(idCard);   
    } else if (idCard.length == 18) {   
        var a_idCard = idCard.split("");// 得到身份证数组
        if(isValidityBrithBy18IdCard(idCard)&&isTrueValidateCodeBy18IdCard(a_idCard)){   
            return true;   
        }else {   
            return false;   
        }   
    } else {   
        return false;   
    }   
}   
/**
 * 判断身份证号码为18位时最后的验证位是否正确
 * 
 * @param a_idCard
 *            身份证号码数组
 * @return
 */  
function isTrueValidateCodeBy18IdCard(a_idCard) {
    var sum = 0; // 声明加权求和变量
    if (a_idCard[17].toLowerCase() == 'x') {   
        a_idCard[17] = 10;// 将最后位为x的验证码替换为10方便后续操作
    }   
    for ( var i = 0; i < 17; i++) {   
        sum += Wi[i] * a_idCard[i];// 加权求和
    }   
    valCodePosition = sum % 11;// 得到验证码所位置
    if (a_idCard[17] == ValideCode[valCodePosition]) {   
        return true;   
    } else {   
        return false;   
    }   
}   
/**
 * 通过身份证判断是男是女
 * 
 * @param idCard
 *            15/18位身份证号码
 * @return 'female'-女、'male'-男
 */  
function maleOrFemalByIdCard(idCard){  
    idCard = trim(idCard.replace(/ /g, ""));// 对身份证号码做处理。包括字符间有空格。
    if(idCard.length==15){   
        if(idCard.substring(14,15)%2==0){   
            return 'female';   
        }else{   
            return 'male';   
        }   
    }else if(idCard.length ==18){   
        if(idCard.substring(14,17)%2==0){   
            return 'female';   
        }else{   
            return 'male';   
        }   
    }else{   
        return null;   
    }   
}   
 /**
	 * 验证18位数身份证号码中的生日是否是有效生日
	 * 
	 * @param idCard
	 *            18位书身份证字符串
	 * @return
	 */  
function isValidityBrithBy18IdCard(idCard18){   
    var year =  idCard18.substring(6,10);   
    var month = idCard18.substring(10,12);   
    var day = idCard18.substring(12,14);   
    var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day));   
    // 这里用getFullYear()获取年份，避免千年虫问题
    if(temp_date.getFullYear()!=parseFloat(year)   
          ||temp_date.getMonth()!=parseFloat(month)-1   
          ||temp_date.getDate()!=parseFloat(day)){   
            return false;   
    }else{   
        return true;   
    }   
}   
  /**
	 * 验证15位数身份证号码中的生日是否是有效生日
	 * 
	 * @param idCard15
	 *            15位书身份证字符串
	 * @return
	 */  
  function isValidityBrithBy15IdCard(idCard15){   
      var year =  idCard15.substring(6,8);   
      var month = idCard15.substring(8,10);   
      var day = idCard15.substring(10,12);   
      var temp_date = new Date(year,parseFloat(month)-1,parseFloat(day));   
      // 对于老身份证中的你年龄则不需考虑千年虫问题而使用getYear()方法
      if(temp_date.getYear()!=parseFloat(year)   
              ||temp_date.getMonth()!=parseFloat(month)-1   
              ||temp_date.getDate()!=parseFloat(day)){   
                return false;   
        }else{   
            return true;   
        }   
  } 
  
// 加法函数
  function accAdd(arg1, arg2) {
  	var r1, r2, m;
  	try {
  		r1 = arg1.toString().split(".")[1].length;
  	}
  	catch (e) {
  		r1 = 0;
  	}
  	try {
  		r2 = arg2.toString().split(".")[1].length;
  	}
  	catch (e) {
  		r2 = 0;
  	}
  	m = Math.pow(10, Math.max(r1, r2));
  	return (arg1 * m + arg2 * m) / m;
  } 
  // 给Number类型增加一个add方法，，使用时直接用 .add 即可完成计算。
  Number.prototype.add = function (arg) {
  	return accAdd(arg, this);
  };

  // 减法函数
  function Subtr(arg1, arg2) {
  	var r1, r2, m, n;
  	try {
  		r1 = arg1.toString().split(".")[1].length;
  	}
  	catch (e) {
  		r1 = 0;
  	}
  	try {
  		r2 = arg2.toString().split(".")[1].length;
  	}
  	catch (e) {
  		r2 = 0;
  	}
  	m = Math.pow(10, Math.max(r1, r2));
       // last modify by deeka
       // 动态控制精度长度
  	n = (r1 >= r2) ? r1 : r2;
  	return ((arg1 * m - arg2 * m) / m).toFixed(n);
  }

  // 给Number类型增加一个add方法，，使用时直接用 .sub 即可完成计算。
  Number.prototype.sub = function (arg) {
  	return Subtr(this, arg);
  };

  // 乘法函数
  function accMul(arg1, arg2) {
  	var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
  	try {
  		m += s1.split(".")[1].length;
  	}
  	catch (e) {
  	}
  	try {
  		m += s2.split(".")[1].length;
  	}
  	catch (e) {
  	}
  	return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
  } 
  // 给Number类型增加一个mul方法，使用时直接用 .mul 即可完成计算。
  Number.prototype.mul = function (arg) {
  	return accMul(arg, this);
  }; 

  // 除法函数
  function accDiv(arg1, arg2) {
  	var t1 = 0, t2 = 0, r1, r2;
  	try {
  		t1 = arg1.toString().split(".")[1].length;
  	}
  	catch (e) {
  	}
  	try {
  		t2 = arg2.toString().split(".")[1].length;
  	}
  	catch (e) {
  	}
  	with (Math) {
  		r1 = Number(arg1.toString().replace(".", ""));
  		r2 = Number(arg2.toString().replace(".", ""));
  		return (r1 / r2) * pow(10, t2 - t1);
  	}
  } 
  // 给Number类型增加一个div方法，，使用时直接用 .div 即可完成计算。
  Number.prototype.div = function (arg) {
  	return accDiv(this, arg);
  }; 
  
Date.prototype.format = function(format){
	  var o = {
		  "M+" : this.getMonth()+1, // month
		  "d+" : this.getDate(), // day
		  "h+" : this.getHours(), // hour
		  "m+" : this.getMinutes(), // minute
		  "s+" : this.getSeconds(), // second
		  "q+" : Math.floor((this.getMonth()+3)/3), // quarter
		  "S" : this.getMilliseconds() // millisecond
	  } 

	  if(/(y+)/.test(format)) { 
		  format = format.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length)); 
	  } 

	  for(var k in o) { 
		  if(new RegExp("("+ k +")").test(format)) { 
			  format = format.replace(RegExp.$1, RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length)); 
		  } 
	  } 
	  return format;
}

Date.prototype.Format = function(fmt) 
{ //author: meizz 
  var o = { 
    "M+" : this.getMonth()+1,                 //月份 
    "d+" : this.getDate(),                    //日 
    "h+" : this.getHours(), 				  //小时
    "H+" : this.getHours(), 				  //小时 
    "m+" : this.getMinutes(),                 //分 
    "s+" : this.getSeconds(),                 //秒 
    "q+" : Math.floor((this.getMonth()+3)/3), //季度 
    "S"  : this.getMilliseconds()             //毫秒 
  }; 
  if(/(y+)/.test(fmt)) 
    fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length)); 
  for(var k in o) 
    if(new RegExp("("+ k +")").test(fmt)) 
  fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length))); 
  return fmt; 
}

function readCookie(name){
  var cookieValue = "";
  var search = name + "=";
  if(document.cookie.length > 0)  { 
    offset = document.cookie.indexOf(search);
    if (offset != -1)    { 
      offset += search.length;
      end = document.cookie.indexOf(";", offset);
      if (end == -1) end = document.cookie.length;
      cookieValue = unescape(document.cookie.substring(offset, end))
    }
  }
  return cookieValue;
}
function writeCookie(name, value, hours){
  var expire = "";
  if(hours != null)  {
    expire = new Date((new Date()).getTime() + hours * 3600000);
    expire = "; expires=" + expire.toGMTString();
  }
  document.cookie = name + "=" + escape(value) + expire;
}


